<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // function test1(){
        //     function test2(){
        //         var b = 2;
        //         console.log(a);
        //     }
        //     var a = 1;
        //     return test2;
        // }

        // var c = 3;
        // var test3 = test1();

        // 1、当test1函数被执行结束后，因为test2被返回到外部，且被全局变量
        //    test3接收。这时test1的AO并没有销毁，只是把线剪断了，test2的
        //    作用域链还连着的。
        // 2、test3执行，test2的作用域链增加自己的AO，当打印a的时候，在自己
        //    的AO上没有查找到，则向test1的AO查找。再次执行test3时，实际操作
        //    的仍然是原来test1的AO。

        // test1定义    test1.[[scope]] -> scope chain -> 0 : GO
        // test1执行    test1.[[scope]] -> scope chain -> 0 : test1 -> AO
        //                                                1 : GO
        // test2定义    test2.[[scope]] -> scope chain -> 0 : test1 -> AO
        //                                                1 : GO
        // test1结束    

        // 总结
        // 当内部函数被返回到外部并保存时，一定会产生闭包，闭包会产生原来的
        // 作用域链不释放，
        // 过渡的闭包可能会导致内存泄露，或加载过慢。

        // function breadMgr(num){
        //     var breadNum = num || 10;

        //     function supply(){
        //         breadNum += 10;
        //         console.log(breadNum);
        //     }

        //     function sale(){
        //         breadNum--;
        //         console.log(breadNum);
        //     }

        //     return [supply, sale];
        // }

        // var breadMgrArr = breadMgr(); // 闭包

        // breadMgrArr[0]();
        // breadMgrArr[1]();

        // function sunSched(){
        //     var sunSched = '';
        //     var operation = {
        //         setSched: function(thing){
        //             sunSched = thing;
        //         },
        //         showSched: function(){
        //             console.log("My Schedule on sunday is " + sunSched);
        //         }
        //     }
        //     return operation;
        // }

        // var sunSched = sunSched();
        // sunSched.setSched('studying');
        // sunSched.setSched('walking');
        // sunSched.showSched();

        
    </script>
</body>
</html>